package com.gl.glcourses.services.impl;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.gl.glcourses.vos.*;
import com.gl.glcourses.vos.constants.Constants;
import com.gl.glcourses.repository.ICursosRepository;
import com.gl.glcourses.repository.IRecursoRepository;
import com.gl.glcourses.repository.IStaticRepository;
import com.gl.glcourses.services.ICursoServices;

import flex.messaging.FlexContext;

@Service
@RemotingDestination(channels = { "my-amf" })
@Transactional
public class CursoServices implements ICursoServices{

	@SuppressWarnings("rawtypes")
	@Autowired
	ICursosRepository repoCurso;
	@Autowired
	ICursosRepository repocurso;
	@Autowired
	IRecursoRepository reporecurso;
	protected final Log logger = LogFactory.getLog(getClass());

	@Transactional
	@Override
	public Confirmacion agregarCurso(Curso curso)throws Exception{
		Confirmacion confirmacion=new Confirmacion();
	
		if(curso.getNombre() == null){		
			confirmacion.setEstado(Constants.CONFIRMACION_ERROR);
			confirmacion.setErrorString(Constants.CURSO_ERROR_NOMBRE);
			return confirmacion;
		}	
		//es el que se repite el curso	
		if (repoCurso.findCurso("nombre", curso.getNombre()) != null)
		{
			confirmacion.setEstado(Constants.CONFIRMACION_ERROR);
			confirmacion.setErrorString(Constants.CURSO_REPETIDO);
			return confirmacion;
			}
		if (curso.getMaterialesAdjunto().size() != 0){
			//guardo los adjuntos el curso
			for(MaterialAdjunto materialAdjunto : curso.getMaterialesAdjunto()){
			    materialAdjunto.setCurso(curso);
				//repocurso.save(materialAdjunto);	   
		}
	}
		//guardo el curso
		curso = (Curso) repoCurso.saveUpdate(curso);
		
		
		//nueva estadistica
		StaticTopCurso newStatic = new StaticTopCurso();
		newStatic.setCurso(curso);
		//repoStatic.saveStatic(newStatic);
		confirmacion.setEstado(Constants.CONFIRMACION_OK);
		return confirmacion;
	
	}

	@Transactional
	@Override
	public Confirmacion modificarCurso(Curso curso)throws Exception{

		Confirmacion confirmacion = new Confirmacion();	
		confirmacion.setEstado(Constants.CONFIRMACION_ERROR);
		repoCurso.saveUpdate(curso);
		confirmacion.setEstado(Constants.CONFIRMACION_OK);

		return confirmacion;
	}
	

	public List<Curso> listarCursos() throws Exception {
		logger.info("getCursosList");
		return repoCurso.getListEntity(Curso.class);
	}
	

	@Transactional
	@Override
	public Confirmacion agregarVoto(Usuario usuario,VotacionCurso votacionCurso, String comentario, int puntuacion) throws Exception{
		Confirmacion confirmacion = new Confirmacion();
		Voto voto = new Voto();
		
		voto.setUsuario(usuario);
		voto.setComentario(comentario);
		voto.setPuntuacion(puntuacion);
		voto.setVotacionCurso(votacionCurso);	
		
		this.votoUnico(voto);
		
		confirmacion.setEstado(true);
		return confirmacion;
	}

	@Transactional
	@SuppressWarnings("unchecked")
	@Override
	public void votoUnico(Voto voto) throws Exception{	
		Voto votoRepetido;
		VotacionCurso votacionCurso = null;
		
		votacionCurso =(VotacionCurso) repoCurso.findById(voto.getVotacionCurso().getId(), VotacionCurso.class);
		votoRepetido = repoCurso.buscarVoto(voto.getUsuario().getNombre(),voto.getVotacionCurso().getId());
		
		if(votoRepetido!=null){
			repoCurso.delete(votoRepetido);
			
//		votacionCurso.quitarVoto();
		}
//		votacionCurso.agregarVoto();
		repoCurso.save(voto);
		repoCurso.save(votacionCurso);
	}

	@Transactional
	@SuppressWarnings("unchecked")
	public List<Voto> votosUsuario(Usuario usuario) throws Exception{
		return (List<Voto>) repoCurso.getVotosUsuario(usuario);
		
	}

	//Si se empiezan a hacer otros metodos para el usuario CREAR TODO EN USUARIO
	@Transactional
	@SuppressWarnings("unchecked")
	public Confirmacion agregarUsuario(Usuario usuario) throws Exception{
		Confirmacion confirmacion = new Confirmacion();
		repoCurso.saveUpdate(usuario);
		confirmacion.setEstado(Constants.CONFIRMACION_ERROR);
		return confirmacion;
	}

	@Transactional
	public Curso buscarCurso(Curso curso) throws Exception{
		return (Curso)repoCurso.findCurso("nombre",curso.getNombre());
	}

}
